static GtkStyleClass *parent_class;
-
typedef enum {
CHECK_AA,
CHECK_BASE,
{ radio_text_bits, NULL }
};
-
static gboolean
get_system_font(LOGFONT *lf)
{
return ok;
}
-
static void
setup_system_font(GtkStyle *style)
{
LOGFONT lf;
-
+
if (get_system_font(&lf))
{
- char buf[64]; // It's okay, lfFaceName is smaller than 32 chars
+ char buf[64]; /* It's okay, lfFaceName is smaller than 32 chars */
int pt_size;
pt_size = -MulDiv(lf.lfHeight, 72,
style->font_desc = pango_font_description_from_string(buf);
}
}
-
-
static void
sys_color_to_gtk_color(int id, GdkColor *pcolor)
}
static void
-setup_system_colors(GtkStyle *style)
+setup_system_styles(GtkStyle *style)
{
char buf[1024];
GdkColor menu_color;
GdkColor bg_prelight;
GdkColor base_prelight;
GdkColor text_prelight;
+ GdkColor tooltip_back;
+ GdkColor tooltip_fore;
+ GdkColor btn_fore;
+ GdkColor progress_back;
+
int i;
/* Default forgeground */
sys_color_to_gtk_color(COLOR_WINDOWTEXT, &style->text[GTK_STATE_PRELIGHT]);
sys_color_to_gtk_color(COLOR_HIGHLIGHTTEXT, &style->text[GTK_STATE_SELECTED]);
sys_color_to_gtk_color(COLOR_GRAYTEXT, &style->text[GTK_STATE_INSENSITIVE]);
-
+
/* Prelight */
sys_color_to_gtk_color(COLOR_HIGHLIGHTTEXT, &fg_prelight);
sys_color_to_gtk_color(COLOR_HIGHLIGHT, &bg_prelight);
sys_color_to_gtk_color(COLOR_MENUTEXT, &menu_text_color);
sys_color_to_gtk_color(COLOR_MENU, &menu_color);
+ /* tooltips */
+ sys_color_to_gtk_color(COLOR_INFOTEXT, &tooltip_fore);
+ sys_color_to_gtk_color(COLOR_INFOBK, &tooltip_back);
+
+ /* text on push buttons. TODO: button shadows, backgrounds, and highlights */
+ sys_color_to_gtk_color(COLOR_BTNTEXT, &btn_fore);
+
+ /* progress bar background color */
+ sys_color_to_gtk_color(COLOR_HIGHLIGHT, &progress_back);
+
+ /* TODO: scrollbars
+ http://lxr.mozilla.org/mozilla/source/gfx/src/windows/nsNativeThemeWin.cpp#1317
+ http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getsystemmetrics.asp
+ http://developer.gnome.org/doc/API/2.0/gtk/GtkRange.html
+ */
for (i = 0; i < 5; i++)
{
sys_color_to_gtk_color(COLOR_3DSHADOW, &style->dark[i]);
sys_color_to_gtk_color(COLOR_3DHILIGHT, &style->light[i]);
-
+
style->mid[i].red = (style->light[i].red + style->dark[i].red) / 2;
style->mid[i].green = (style->light[i].green + style->dark[i].green) / 2;
style->mid[i].blue = (style->light[i].blue + style->dark[i].blue) / 2;
style->text_aa[i].green = (style->text[i].green + style->base[i].green) / 2;
style->text_aa[i].blue = (style->text[i].blue + style->base[i].blue) / 2;
}
-
- // Enable coloring for menus.
+
+ /* Enable coloring for menus. */
sprintf(buf, "style \"wimp-menu\"\n"
"{fg[PRELIGHT] = { %d, %d, %d }\n"
"bg[PRELIGHT] = { %d, %d, %d }\n"
menu_color.green,
menu_color.blue);
gtk_rc_parse_string(buf);
-}
-
+ /* enable coloring for tooltips */
+ sprintf(buf, "style \"wimp-tooltips\"\n"
+ "{fg[NORMAL] = { %d, %d, %d }\n"
+ "bg[NORMAL] = { %d, %d, %d }\n"
+ "}widget \"*gtk-tooltips*\" style \"wimp-tooltips\"\n",
+ tooltip_fore.red,
+ tooltip_fore.green,
+ tooltip_fore.blue,
+ tooltip_back.red,
+ tooltip_back.green,
+ tooltip_back.blue);
+ gtk_rc_parse_string(buf);
+ /* enable coloring for text on buttons
+ TODO: use GetThemeMetric for the border and outside border */
+ sprintf(buf, "style \"wimp-button\"\n"
+ "fg[NORMAL] = { %d, %d, %d }\n"
+ "default_border = { 1, 1, 1, 1 }\n"
+ "default_outside_border = { 0, 0, 0, 0 }\n"
+ "child_displacement_x = 1\n"
+ "child_displacement_y = 1\n"
+ "}widget_class \"*GtkButton*\" style \"wimp-button\"\n",
+ btn_fore.red,
+ btn_fore.green,
+ btn_fore.blue);
+ gtk_rc_parse_string(buf);
+ /* enable coloring for progress bars */
+ sprintf(buf, "style \"wimp-progress\"\n"
+ "{bg[PRELIGHT] = { %d, %d, %d }\n"
+ "}widget_class \"*GtkProgress*\" style \"wimp-progress\"\n",
+ progress_back.red,
+ progress_back.green,
+ progress_back.blue);
+ gtk_rc_parse_string(buf);
+}
-static gboolean
+static gboolean
sanitize_size (GdkWindow *window,
gint *width,
gint *height)
{
if (area)
gdk_gc_set_clip_rectangle (gc, area);
-
+
if (!parts[part].bmap)
parts[part].bmap = gdk_bitmap_create_from_data (drawable,
parts[part].bits,
{
x -= (1 + PART_SIZE - width) / 2;
y -= (1 + PART_SIZE - height) / 2;
-
+
if (detail && strcmp (detail, "check") == 0) /* Menu item */
{
if (shadow == GTK_SHADOW_IN)
draw_part (window, style->mid_gc[state], area, x, y, CHECK_MID);
draw_part (window, style->light_gc[state], area, x, y, CHECK_LIGHT);
draw_part (window, style->base_gc[state], area, x, y, CHECK_BASE);
-
+
if (shadow == GTK_SHADOW_IN)
{
draw_part (window, style->text_gc[state], area, x, y, CHECK_TEXT);
xp_expander = XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED;
break;
}
-
+
if (xp_theme_draw(window, xp_expander, style,
x, y - expander_size / 2,
expander_size, expander_size, state))
if (success)
gdk_gc_set_foreground (style->fg_gc[state], &values.foreground);
-
+
gdk_draw_line
(window, style->fg_gc[state], x + 2, y + expander_semi_size,
x + expander_size - 2, y + expander_semi_size);
{
x -= (1 + PART_SIZE - width) / 2;
y -= (1 + PART_SIZE - height) / 2;
-
+
if (detail && strcmp (detail, "option") == 0) /* Menu item */
{
if (shadow == GTK_SHADOW_IN)
draw_part (window, style->mid_gc[state], area, x, y, RADIO_MID);
draw_part (window, style->light_gc[state], area, x, y, RADIO_LIGHT);
draw_part (window, style->base_gc[state], area, x, y, RADIO_BASE);
-
+
if (shadow == GTK_SHADOW_IN)
draw_part (window, style->text_gc[state], area, x, y, RADIO_TEXT);
}
if (area)
gdk_gc_set_clip_rectangle (gc, area);
-
+
width = width + width % 2 - 1; /* Force odd */
-
+
steps = 1 + width / 2;
extra = height - steps;
x + (i - extra), y_start + i * y_increment,
x + width - (i - extra) - 1, y_start + i * y_increment);
}
-
+
if (area)
gdk_gc_set_clip_rectangle (gc, NULL);
if (area)
gdk_gc_set_clip_rectangle (gc, area);
-
+
height = height + height % 2 - 1; /* Force odd */
-
+
steps = 1 + height / 2;
extra = width - steps;
x_start + i * x_increment, y + (i - extra),
x_start + i * x_increment, y + height - (i - extra) - 1);
}
-
+
if (area)
gdk_gc_set_clip_rectangle (gc, NULL);
gint slider_width = 14, stepper_size = 14;
gint box_width;
gint box_height;
-
+
if (range)
{
gtk_widget_style_get (range,
"stepper_size", &stepper_size,
NULL);
}
-
+
if (arrow_type == GTK_ARROW_UP || arrow_type == GTK_ARROW_DOWN)
{
box_width = slider_width;
gint height)
{
sanitize_size (window, &width, &height);
-
+
if (detail && strcmp (detail, "spinbutton") == 0)
{
if (xp_theme_is_drawable(XP_THEME_ELEMENT_SPIN_BUTTON_UP))
{
x += (width - 7) / 2;
y += (height - 5) / 2;
-
+
draw_varrow (window, style->fg_gc[state], shadow, area, arrow_type,
x, y, 7, 5);
}
{
x += (width - 5) / 2;
y += (height - 7) / 2;
-
+
draw_harrow (window, style->fg_gc[state], shadow, area, arrow_type,
x, y, 5, 7);
}
{
GtkRequisition *tmp_size = NULL;
GtkBorder *tmp_spacing = NULL;
-
+
if (widget)
- gtk_widget_style_get (widget,
+ gtk_widget_style_get (widget,
"indicator_size", &tmp_size,
"indicator_spacing", &tmp_spacing,
NULL);
*indicator_spacing = default_option_indicator_spacing;
}
-static void
+static void
draw_box (GtkStyle *style,
GdkWindow *window,
GtkStateType state_type,
else if (detail && (!strcmp (detail, "spinbutton_up")
|| !strcmp (detail, "spinbutton_down")))
{
- if (xp_theme_draw(window,
+ if (xp_theme_draw(window,
(! strcmp (detail, "spinbutton_up"))
? XP_THEME_ELEMENT_SPIN_BUTTON_UP
: XP_THEME_ELEMENT_SPIN_BUTTON_DOWN,
if (GTK_IS_SCROLLBAR(widget))
{
GtkScrollbar * scrollbar = GTK_SCROLLBAR(widget);
- if (xp_theme_draw(window,
+ if (xp_theme_draw(window,
(! GTK_IS_VSCROLLBAR(widget))
? XP_THEME_ELEMENT_SCROLLBAR_V
: XP_THEME_ELEMENT_SCROLLBAR_H,
}
}
- if (detail && strcmp (detail, "menuitem") == 0)
+ if (detail && strcmp (detail, "menuitem") == 0)
shadow_type = GTK_SHADOW_NONE;
-
+
if (detail && !strcmp (detail, "trough"))
{
if (widget && GTK_IS_PROGRESS_BAR (widget))
}
else
{
- // Blank in classic Windows
+ /* Blank in classic Windows */
}
}
else
{
gboolean is_vertical = GTK_IS_VSCROLLBAR(widget);
-
+
if (GTK_IS_RANGE(widget)
&& xp_theme_draw(window,
is_vertical
GdkPixmap *pixmap;
sanitize_size (window, &width, &height);
-
+
pixmap = gdk_pixmap_new (window, 2, 2, -1);
gdk_draw_point (pixmap, style->bg_gc[GTK_STATE_NORMAL], 0, 0);
if (area)
gdk_gc_set_clip_rectangle (gc, area);
-
+
gdk_draw_rectangle (window, gc, TRUE, x, y, width, height);
gdk_gc_unref (gc);
gdk_pixmap_unref (pixmap);
-
+
return;
}
}
option_menu_get_props (widget, &indicator_size, &indicator_spacing);
sanitize_size (window, &width, &height);
-
+
if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
vline_x = x + indicator_size.width + indicator_spacing.left + indicator_spacing.right;
- else
+ else
vline_x = x + width - (indicator_size.width + indicator_spacing.left + indicator_spacing.right) - style->xthickness;
parent_class->draw_vline (style, window, state_type, area, widget,
{
GtkRequisition indicator_size;
GtkBorder indicator_spacing;
-
+
gint arrow_height;
-
+
g_return_if_fail (style != NULL);
g_return_if_fail (window != NULL);
x += (width - indicator_size.width) / 2;
arrow_height = (indicator_size.width + 1) / 2;
-
+
y += (height - arrow_height) / 2;
draw_varrow (window, style->black_gc, shadow, area, GTK_ARROW_DOWN,
x, y, indicator_size.width, arrow_height);
}
-
static void
draw_extension(GtkStyle *style,
GdkWindow *window,
return;
}
}
- parent_class->draw_extension
+ parent_class->draw_extension
(style, window, state_type, shadow_type, area, widget, detail,
x, y, width, height, gap_side);
}
}
}
- // gtk_style_apply_default_background (style, window,
- // widget && !GTK_WIDGET_NO_WINDOW (widget),
- // state_type, area, x, y, width, height);
-
+ /* gtk_style_apply_default_background (style, window,
+ widget && !GTK_WIDGET_NO_WINDOW (widget),
+ state_type, area, x, y, width, height);
+ */
parent_class->draw_flat_box(style, window, state_type, shadow_type,
area, widget, detail, x, y, width, height);
}
-
static void
draw_shadow (GtkStyle *style,
GdkWindow *window,
detail, x, y, width, height);
}
-
static void
wimp_style_init_from_rc (GtkStyle * style, GtkRcStyle * rc_style)
{
setup_system_font (style);
- setup_system_colors (style);
+ setup_system_styles (style);
parent_class->init_from_rc(style, rc_style);
}
0, /* n_preallocs */
(GInstanceInitFunc) wimp_style_init,
};
-
+
wimp_type_style = g_type_module_register_type (module,
GTK_TYPE_STYLE,
"WimpStyle",
-/* Wimp "Windows Impersonator" Engine\r
- *\r
- * Copyright (C) 2003 Raymond Penners <raymond@dotsphinx.com>\r
- *\r
- * This library is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU Library General Public\r
- * License as published by the Free Software Foundation; either\r
- * version 2 of the License, or (at your option) any later version.\r
- *\r
- * This library is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
- * Library General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU Library General Public\r
- * License along with this library; if not, write to the\r
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,\r
- * Boston, MA 02111-1307, USA.\r
- */\r
-\r
-#include "xp_theme.h"\r
-\r
-#include <windows.h>\r
-#include <uxtheme.h>\r
-#include <tmschema.h>\r
-#include <math.h>\r
-#include <string.h>\r
-#include <gdk/gdkwin32.h>\r
-\r
-#include <stdio.h>\r
-\r
-\r
-static LPCWSTR class_descriptors[] =\r
-{\r
- L"Scrollbar",\r
- L"Button",\r
- L"Header",\r
- L"ComboBox",\r
- L"Tab",\r
- L"Edit",\r
- L"TreeView",\r
- L"Spin",\r
- L"Progress",\r
-};\r
-\r
-static const short element_part_map[]=\r
-{\r
- BP_CHECKBOX,\r
- BP_CHECKBOX,\r
- BP_PUSHBUTTON,\r
- HP_HEADERITEM,\r
- CP_DROPDOWNBUTTON,\r
- TABP_BODY,\r
- TABP_TABITEM,\r
- TABP_TABITEMLEFTEDGE,\r
- TABP_PANE,\r
- SBP_THUMBBTNHORZ,\r
- SBP_THUMBBTNVERT,\r
- SBP_ARROWBTN,\r
- SBP_ARROWBTN,\r
- SBP_ARROWBTN,\r
- SBP_ARROWBTN,\r
- SBP_GRIPPERHORZ,\r
- SBP_GRIPPERVERT,\r
- SBP_LOWERTRACKHORZ,\r
- SBP_LOWERTRACKVERT,\r
- EP_EDITTEXT,\r
- BP_PUSHBUTTON,\r
- SPNP_UP,\r
- SPNP_DOWN,\r
- BP_RADIOBUTTON,\r
- TVP_GLYPH,\r
- TVP_GLYPH,\r
- PP_CHUNK,\r
- PP_CHUNKVERT,\r
- PP_BAR,\r
- PP_BARVERT,\r
-};\r
-\r
-\r
-static HINSTANCE uxtheme_dll = NULL;\r
-static HTHEME open_themes[XP_THEME_CLASS__SIZEOF];\r
-\r
-typedef HRESULT (FAR PASCAL *GetThemeSysFontFunc)\r
- (HTHEME hTheme, int iFontID, FAR LOGFONTW *plf);\r
-typedef HTHEME (FAR PASCAL *OpenThemeDataFunc)\r
- (HWND hwnd, LPCWSTR pszClassList);\r
-typedef HRESULT (FAR PASCAL *CloseThemeDataFunc)(HTHEME theme);\r
-typedef HRESULT (FAR PASCAL *DrawThemeBackgroundFunc)\r
- (HTHEME hTheme, HDC hdc, int iPartId, int iStateId,\r
- const RECT *pRect, const RECT *pClipRect);\r
-typedef HRESULT (FAR PASCAL *EnableThemeDialogTextureFunc)(HWND hwnd, DWORD dwFlags);\r
-\r
-static GetThemeSysFontFunc get_theme_sys_font_func = NULL;\r
-static OpenThemeDataFunc open_theme_data_func = NULL;\r
-static CloseThemeDataFunc close_theme_data_func = NULL;\r
-static DrawThemeBackgroundFunc draw_theme_background_func = NULL;\r
-static EnableThemeDialogTextureFunc enable_theme_dialog_texture_func = NULL;\r
-\r
-void\r
-xp_theme_init()\r
-{\r
- int i;\r
- \r
- if (uxtheme_dll)\r
- return;\r
- \r
- uxtheme_dll = LoadLibrary("uxtheme.dll");\r
- memset(open_themes, 0, sizeof(open_themes));\r
- \r
- open_theme_data_func = (OpenThemeDataFunc) GetProcAddress(uxtheme_dll, "OpenThemeData");\r
- close_theme_data_func = (CloseThemeDataFunc) GetProcAddress(uxtheme_dll, "CloseThemeData");\r
- draw_theme_background_func = (DrawThemeBackgroundFunc) GetProcAddress(uxtheme_dll, "DrawThemeBackground");\r
- enable_theme_dialog_texture_func = (EnableThemeDialogTextureFunc) GetProcAddress(uxtheme_dll, "EnableThemeDialogTexture");\r
- get_theme_sys_font_func = (GetThemeSysFontFunc) GetProcAddress(uxtheme_dll, "GetThemeSysFont");\r
-}\r
-\r
-void\r
-xp_theme_exit()\r
-{\r
- int i;\r
- \r
- if(! uxtheme_dll)\r
- return;\r
-\r
- for (i=0; i<XP_THEME_CLASS__SIZEOF; i++)\r
- {\r
- if (open_themes[i])\r
- {\r
- close_theme_data_func(open_themes[i]);\r
- open_themes[i] = NULL;\r
- }\r
- }\r
-\r
- FreeLibrary(uxtheme_dll);\r
- uxtheme_dll = NULL;\r
-\r
- open_theme_data_func = NULL;\r
- close_theme_data_func = NULL;\r
- draw_theme_background_func = NULL;\r
- enable_theme_dialog_texture_func = NULL;\r
- get_theme_sys_font_func = NULL;\r
-}\r
-\r
-static HTHEME\r
-xp_theme_get_handle_by_class(XpThemeClass klazz)\r
-{\r
- if (!open_themes[klazz] && open_theme_data_func)\r
- {\r
- open_themes[klazz] = open_theme_data_func(NULL, class_descriptors[klazz]);\r
- }\r
- return open_themes[klazz];\r
-}\r
-\r
-static HTHEME\r
-xp_theme_get_handle_by_element(XpThemeElement element)\r
-{\r
- HTHEME ret = NULL;\r
- XpThemeClass klazz = XP_THEME_CLASS__SIZEOF;\r
-\r
- switch(element)\r
- {\r
- case XP_THEME_ELEMENT_PRESSED_CHECKBOX:\r
- case XP_THEME_ELEMENT_CHECKBOX:\r
- case XP_THEME_ELEMENT_BUTTON:\r
- case XP_THEME_ELEMENT_DEFAULT_BUTTON:\r
- case XP_THEME_ELEMENT_RADIO_BUTTON:\r
- klazz = XP_THEME_CLASS_BUTTON;\r
- break;\r
-\r
- case XP_THEME_ELEMENT_LIST_HEADER:\r
- klazz = XP_THEME_CLASS_HEADER;\r
- break;\r
- \r
- case XP_THEME_ELEMENT_COMBOBUTTON:\r
- klazz = XP_THEME_CLASS_COMBOBOX;\r
- break;\r
- \r
- case XP_THEME_ELEMENT_BODY:\r
- case XP_THEME_ELEMENT_TAB_ITEM:\r
- case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:\r
- case XP_THEME_ELEMENT_TAB_PANE:\r
- klazz = XP_THEME_CLASS_TAB;\r
- break;\r
- \r
- case XP_THEME_ELEMENT_SCROLLBAR_V:\r
- case XP_THEME_ELEMENT_SCROLLBAR_H:\r
- case XP_THEME_ELEMENT_ARROW_UP: \r
- case XP_THEME_ELEMENT_ARROW_DOWN:\r
- case XP_THEME_ELEMENT_ARROW_LEFT:\r
- case XP_THEME_ELEMENT_ARROW_RIGHT: \r
- case XP_THEME_ELEMENT_GRIP_V: \r
- case XP_THEME_ELEMENT_GRIP_H: \r
- case XP_THEME_ELEMENT_TROUGH_V:\r
- case XP_THEME_ELEMENT_TROUGH_H:\r
- klazz = XP_THEME_CLASS_SCROLLBAR;\r
- break;\r
- \r
- case XP_THEME_ELEMENT_EDIT_TEXT:\r
- klazz = XP_THEME_CLASS_EDIT;\r
- break;\r
-\r
- case XP_THEME_ELEMENT_SPIN_BUTTON_UP:\r
- case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:\r
- klazz = XP_THEME_CLASS_SPIN;\r
- break;\r
-\r
- case XP_THEME_ELEMENT_PROGRESS_BAR_H:\r
- case XP_THEME_ELEMENT_PROGRESS_BAR_V:\r
- case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:\r
- case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:\r
- klazz = XP_THEME_CLASS_PROGRESS;\r
- break;\r
-\r
- case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:\r
- case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:\r
- klazz = XP_THEME_CLASS_TREEVIEW;\r
- break;\r
- }\r
-\r
- if (klazz != XP_THEME_CLASS__SIZEOF)\r
- {\r
- ret = xp_theme_get_handle_by_class (klazz);\r
- }\r
- return ret;\r
-}\r
-\r
-\r
-static int \r
-xp_theme_map_gtk_state(XpThemeElement element, GtkStateType state)\r
-{\r
- int ret;\r
-\r
- switch(element)\r
- {\r
- case XP_THEME_ELEMENT_TAB_PANE:\r
- ret = 0;\r
- break;\r
- \r
- case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:\r
- case XP_THEME_ELEMENT_TAB_ITEM:\r
- switch(state)\r
- {\r
- case GTK_STATE_PRELIGHT:\r
- ret = TIS_HOT;\r
- break;\r
- case GTK_STATE_INSENSITIVE:\r
- ret = TIS_DISABLED;\r
- break;\r
- case GTK_STATE_SELECTED:\r
- case GTK_STATE_ACTIVE:\r
- ret = TIS_NORMAL;\r
- break;\r
- default:\r
- ret = TIS_SELECTED;\r
- }\r
- break;\r
-\r
- case XP_THEME_ELEMENT_EDIT_TEXT:\r
- switch(state)\r
- {\r
- case GTK_STATE_PRELIGHT:\r
- ret = ETS_FOCUSED;\r
- break;\r
- case GTK_STATE_INSENSITIVE:\r
- ret = ETS_READONLY;\r
- break;\r
- case GTK_STATE_SELECTED:\r
- case GTK_STATE_ACTIVE:\r
- default:\r
- ret = ETS_NORMAL;\r
- }\r
- break;\r
-\r
- case XP_THEME_ELEMENT_SCROLLBAR_H:\r
- case XP_THEME_ELEMENT_SCROLLBAR_V:\r
- case XP_THEME_ELEMENT_TROUGH_H:\r
- case XP_THEME_ELEMENT_TROUGH_V:\r
- switch(state)\r
- {\r
- case GTK_STATE_SELECTED:\r
- case GTK_STATE_ACTIVE:\r
- ret = SCRBS_PRESSED;\r
- break;\r
- case GTK_STATE_PRELIGHT:\r
- ret = SCRBS_HOT;\r
- break;\r
- case GTK_STATE_INSENSITIVE:\r
- ret = SCRBS_DISABLED;\r
- break;\r
- default:\r
- ret = SCRBS_NORMAL;\r
- }\r
- break;\r
-\r
- case XP_THEME_ELEMENT_ARROW_DOWN:\r
- switch(state)\r
- {\r
- case GTK_STATE_ACTIVE:\r
- ret = ABS_DOWNPRESSED;\r
- break;\r
- case GTK_STATE_PRELIGHT:\r
- ret = ABS_DOWNHOT;\r
- break;\r
- case GTK_STATE_INSENSITIVE:\r
- ret = ABS_DOWNDISABLED;\r
- break;\r
- default:\r
- ret = ABS_DOWNNORMAL;\r
- }\r
- break;\r
-\r
- case XP_THEME_ELEMENT_ARROW_UP:\r
- switch(state)\r
- {\r
- case GTK_STATE_ACTIVE:\r
- ret = ABS_UPPRESSED;\r
- break;\r
- case GTK_STATE_PRELIGHT:\r
- ret = ABS_UPHOT;\r
- break;\r
- case GTK_STATE_INSENSITIVE:\r
- ret = ABS_UPDISABLED;\r
- break;\r
- default:\r
- ret = ABS_UPNORMAL;\r
- }\r
- break;\r
-\r
- case XP_THEME_ELEMENT_ARROW_LEFT:\r
- switch(state)\r
- {\r
- case GTK_STATE_ACTIVE:\r
- ret = ABS_LEFTPRESSED;\r
- break;\r
- case GTK_STATE_PRELIGHT:\r
- ret = ABS_LEFTHOT;\r
- break;\r
- case GTK_STATE_INSENSITIVE:\r
- ret = ABS_LEFTDISABLED;\r
- break;\r
- default:\r
- ret = ABS_LEFTNORMAL;\r
- }\r
- break;\r
-\r
- case XP_THEME_ELEMENT_ARROW_RIGHT:\r
- switch(state)\r
- {\r
- case GTK_STATE_ACTIVE:\r
- ret = ABS_RIGHTPRESSED;\r
- break;\r
- case GTK_STATE_PRELIGHT:\r
- ret = ABS_RIGHTHOT;\r
- break;\r
- case GTK_STATE_INSENSITIVE:\r
- ret = ABS_RIGHTDISABLED;\r
- break;\r
- default:\r
- ret = ABS_RIGHTNORMAL;\r
- }\r
- break;\r
-\r
- case XP_THEME_ELEMENT_CHECKBOX:\r
- case XP_THEME_ELEMENT_RADIO_BUTTON:\r
- switch(state)\r
- {\r
- case GTK_STATE_SELECTED:\r
- ret = CBS_CHECKEDPRESSED;\r
- break;\r
- case GTK_STATE_PRELIGHT:\r
- ret = CBS_UNCHECKEDHOT;\r
- break;\r
- case GTK_STATE_INSENSITIVE:\r
- ret = CBS_UNCHECKEDDISABLED;\r
- break;\r
- default:\r
- ret = CBS_UNCHECKEDNORMAL;\r
- }\r
- break;\r
-\r
- case XP_THEME_ELEMENT_PRESSED_CHECKBOX:\r
- switch(state)\r
- {\r
- case GTK_STATE_SELECTED:\r
- ret = CBS_CHECKEDPRESSED;\r
- break;\r
- case GTK_STATE_PRELIGHT:\r
- ret = CBS_CHECKEDHOT;\r
- break;\r
- case GTK_STATE_INSENSITIVE:\r
- ret = CBS_CHECKEDDISABLED;\r
- break;\r
- default:\r
- ret = CBS_CHECKEDNORMAL;\r
- }\r
- break;\r
-\r
- XP_THEME_ELEMENT_DEFAULT_BUTTON:\r
- switch(state)\r
- {\r
- case GTK_STATE_ACTIVE:\r
- ret = PBS_PRESSED;\r
- break;\r
- case GTK_STATE_PRELIGHT:\r
- ret = PBS_HOT;\r
- break;\r
- case GTK_STATE_INSENSITIVE:\r
- ret = PBS_DISABLED;\r
- break;\r
- default:\r
- ret = PBS_DEFAULTED;\r
- }\r
- break;\r
-\r
- case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:\r
- switch(state)\r
- {\r
- case GTK_STATE_ACTIVE:\r
- ret = DNS_PRESSED;\r
- break;\r
- case GTK_STATE_PRELIGHT:\r
- ret = DNS_HOT;\r
- break;\r
- case GTK_STATE_INSENSITIVE:\r
- ret = DNS_DISABLED;\r
- break;\r
- default:\r
- ret = DNS_NORMAL;\r
- }\r
- break;\r
-\r
- case XP_THEME_ELEMENT_SPIN_BUTTON_UP:\r
- switch(state)\r
- {\r
- case GTK_STATE_ACTIVE:\r
- ret = UPS_PRESSED;\r
- break;\r
- case GTK_STATE_PRELIGHT:\r
- ret = UPS_HOT;\r
- break;\r
- case GTK_STATE_INSENSITIVE:\r
- ret = UPS_DISABLED;\r
- break;\r
- default:\r
- ret = UPS_NORMAL;\r
- }\r
- break;\r
-\r
- case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:\r
- ret = GLPS_OPENED;\r
- break;\r
-\r
- case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:\r
- ret = GLPS_CLOSED;\r
- break;\r
-\r
- case XP_THEME_ELEMENT_PROGRESS_BAR_H:\r
- case XP_THEME_ELEMENT_PROGRESS_BAR_V:\r
- case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:\r
- case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:\r
- ret = 0;\r
- break;\r
- \r
- default:\r
- switch(state)\r
- {\r
- case GTK_STATE_ACTIVE:\r
- ret = PBS_PRESSED;\r
- break;\r
- case GTK_STATE_PRELIGHT:\r
- ret = PBS_HOT;\r
- break;\r
- case GTK_STATE_INSENSITIVE:\r
- ret = PBS_DISABLED;\r
- break;\r
- default:\r
- ret = PBS_NORMAL;\r
- }\r
- }\r
- return ret;\r
-} \r
-\r
-gboolean\r
-xp_theme_draw(GdkWindow *win, XpThemeElement element, GtkStyle *style,\r
- int x, int y, int width, int height, GtkStateType state_type)\r
-{\r
- HTHEME theme;\r
- RECT rect;\r
- int xoff, yoff, state;\r
- HDC dc;\r
- GdkDrawable *drawable;\r
- int part_state;\r
- \r
- if (!uxtheme_dll)\r
- return FALSE;\r
-\r
- theme = xp_theme_get_handle_by_element(element);\r
- if (!theme)\r
- return FALSE;\r
-\r
- // FIXME: Recheck its function\r
- enable_theme_dialog_texture_func(GDK_WINDOW_HWND(win), ETDT_ENABLETAB);\r
-\r
- if (!GDK_IS_WINDOW(win))\r
- {\r
- xoff = 0;\r
- yoff = 0;\r
- drawable = win;\r
- }\r
- else\r
- {\r
- gdk_window_get_internal_paint_info(win, &drawable, &xoff, &yoff);\r
- }\r
- rect.left = x - xoff;\r
- rect.top = y - yoff;\r
- rect.right = rect.left + width;\r
- rect.bottom = rect.top + height;\r
-\r
- gdk_gc_set_clip_rectangle (style->dark_gc[state_type], NULL);\r
- dc = gdk_win32_hdc_get(drawable, style->dark_gc[state_type], 0);\r
- if (!dc)\r
- return FALSE;\r
-\r
- part_state = xp_theme_map_gtk_state(element, state_type);\r
- draw_theme_background_func(theme, dc, element_part_map[element], part_state, &rect, 0);\r
- gdk_win32_hdc_release(drawable, style->dark_gc[state_type], 0);\r
-\r
- return TRUE;\r
-}\r
-\r
-gboolean\r
-xp_theme_is_drawable(XpThemeElement element)\r
-{\r
- gboolean ret = FALSE;\r
- \r
- if (uxtheme_dll)\r
- {\r
- ret = xp_theme_get_handle_by_element(element) != NULL;\r
- }\r
- return ret;\r
-}\r
-\r
-gboolean\r
-xp_theme_get_system_font(LOGFONTW *lf)\r
-{\r
- gboolean ret = FALSE;\r
- if (get_theme_sys_font_func != NULL)\r
- {\r
- HRESULT hr = (*get_theme_sys_font_func)(NULL, TMT_MSGBOXFONT, lf);\r
- ret = (hr == S_OK);\r
- }\r
- return ret;\r
-}\r
+/* Wimp "Windows Impersonator" Engine
+ *
+ * Copyright (C) 2003 Raymond Penners <raymond@dotsphinx.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "xp_theme.h"
+
+#include <windows.h>
+#include <uxtheme.h>
+#include <tmschema.h>
+#include <math.h>
+#include <string.h>
+#include <gdk/gdkwin32.h>
+
+#include <stdio.h>
+
+static LPCWSTR class_descriptors[] =
+{
+ L"Scrollbar",
+ L"Button",
+ L"Header",
+ L"ComboBox",
+ L"Tab",
+ L"Edit",
+ L"TreeView",
+ L"Spin",
+ L"Progress",
+};
+
+static const short element_part_map[]=
+{
+ BP_CHECKBOX,
+ BP_CHECKBOX,
+ BP_PUSHBUTTON,
+ HP_HEADERITEM,
+ CP_DROPDOWNBUTTON,
+ TABP_BODY,
+ TABP_TABITEM,
+ TABP_TABITEMLEFTEDGE,
+ TABP_PANE,
+ SBP_THUMBBTNHORZ,
+ SBP_THUMBBTNVERT,
+ SBP_ARROWBTN,
+ SBP_ARROWBTN,
+ SBP_ARROWBTN,
+ SBP_ARROWBTN,
+ SBP_GRIPPERHORZ,
+ SBP_GRIPPERVERT,
+ SBP_LOWERTRACKHORZ,
+ SBP_LOWERTRACKVERT,
+ EP_EDITTEXT,
+ BP_PUSHBUTTON,
+ SPNP_UP,
+ SPNP_DOWN,
+ BP_RADIOBUTTON,
+ TVP_GLYPH,
+ TVP_GLYPH,
+ PP_CHUNK,
+ PP_CHUNKVERT,
+ PP_BAR,
+ PP_BARVERT,
+};
+
+static HINSTANCE uxtheme_dll = NULL;
+static HTHEME open_themes[XP_THEME_CLASS__SIZEOF];
+
+typedef HRESULT (FAR PASCAL *GetThemeSysFontFunc)
+ (HTHEME hTheme, int iFontID, FAR LOGFONTW *plf);
+typedef HTHEME (FAR PASCAL *OpenThemeDataFunc)
+ (HWND hwnd, LPCWSTR pszClassList);
+typedef HRESULT (FAR PASCAL *CloseThemeDataFunc)(HTHEME theme);
+typedef HRESULT (FAR PASCAL *DrawThemeBackgroundFunc)
+ (HTHEME hTheme, HDC hdc, int iPartId, int iStateId,
+ const RECT *pRect, const RECT *pClipRect);
+typedef HRESULT (FAR PASCAL *EnableThemeDialogTextureFunc)(HWND hwnd, DWORD dwFlags);
+
+static GetThemeSysFontFunc get_theme_sys_font_func = NULL;
+static OpenThemeDataFunc open_theme_data_func = NULL;
+static CloseThemeDataFunc close_theme_data_func = NULL;
+static DrawThemeBackgroundFunc draw_theme_background_func = NULL;
+static EnableThemeDialogTextureFunc enable_theme_dialog_texture_func = NULL;
+
+void
+xp_theme_init()
+{
+ int i;
+
+ if (uxtheme_dll)
+ return;
+
+ uxtheme_dll = LoadLibrary("uxtheme.dll");
+ memset(open_themes, 0, sizeof(open_themes));
+
+ open_theme_data_func = (OpenThemeDataFunc) GetProcAddress(uxtheme_dll, "OpenThemeData");
+ close_theme_data_func = (CloseThemeDataFunc) GetProcAddress(uxtheme_dll, "CloseThemeData");
+ draw_theme_background_func = (DrawThemeBackgroundFunc) GetProcAddress(uxtheme_dll, "DrawThemeBackground");
+ enable_theme_dialog_texture_func = (EnableThemeDialogTextureFunc) GetProcAddress(uxtheme_dll, "EnableThemeDialogTexture");
+ get_theme_sys_font_func = (GetThemeSysFontFunc) GetProcAddress(uxtheme_dll, "GetThemeSysFont");
+}
+
+void
+xp_theme_exit()
+{
+ int i;
+
+ if(! uxtheme_dll)
+ return;
+
+ for (i=0; i<XP_THEME_CLASS__SIZEOF; i++)
+ {
+ if (open_themes[i])
+ {
+ close_theme_data_func(open_themes[i]);
+ open_themes[i] = NULL;
+ }
+ }
+
+ FreeLibrary(uxtheme_dll);
+ uxtheme_dll = NULL;
+
+ open_theme_data_func = NULL;
+ close_theme_data_func = NULL;
+ draw_theme_background_func = NULL;
+ enable_theme_dialog_texture_func = NULL;
+ get_theme_sys_font_func = NULL;
+}
+
+static HTHEME
+xp_theme_get_handle_by_class(XpThemeClass klazz)
+{
+ if (!open_themes[klazz] && open_theme_data_func)
+ {
+ open_themes[klazz] = open_theme_data_func(NULL, class_descriptors[klazz]);
+ }
+ return open_themes[klazz];
+}
+
+static HTHEME
+xp_theme_get_handle_by_element(XpThemeElement element)
+{
+ HTHEME ret = NULL;
+ XpThemeClass klazz = XP_THEME_CLASS__SIZEOF;
+
+ switch(element)
+ {
+ case XP_THEME_ELEMENT_PRESSED_CHECKBOX:
+ case XP_THEME_ELEMENT_CHECKBOX:
+ case XP_THEME_ELEMENT_BUTTON:
+ case XP_THEME_ELEMENT_DEFAULT_BUTTON:
+ case XP_THEME_ELEMENT_RADIO_BUTTON:
+ klazz = XP_THEME_CLASS_BUTTON;
+ break;
+
+ case XP_THEME_ELEMENT_LIST_HEADER:
+ klazz = XP_THEME_CLASS_HEADER;
+ break;
+
+ case XP_THEME_ELEMENT_COMBOBUTTON:
+ klazz = XP_THEME_CLASS_COMBOBOX;
+ break;
+
+ case XP_THEME_ELEMENT_BODY:
+ case XP_THEME_ELEMENT_TAB_ITEM:
+ case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:
+ case XP_THEME_ELEMENT_TAB_PANE:
+ klazz = XP_THEME_CLASS_TAB;
+ break;
+
+ case XP_THEME_ELEMENT_SCROLLBAR_V:
+ case XP_THEME_ELEMENT_SCROLLBAR_H:
+ case XP_THEME_ELEMENT_ARROW_UP:
+ case XP_THEME_ELEMENT_ARROW_DOWN:
+ case XP_THEME_ELEMENT_ARROW_LEFT:
+ case XP_THEME_ELEMENT_ARROW_RIGHT:
+ case XP_THEME_ELEMENT_GRIP_V:
+ case XP_THEME_ELEMENT_GRIP_H:
+ case XP_THEME_ELEMENT_TROUGH_V:
+ case XP_THEME_ELEMENT_TROUGH_H:
+ klazz = XP_THEME_CLASS_SCROLLBAR;
+ break;
+
+ case XP_THEME_ELEMENT_EDIT_TEXT:
+ klazz = XP_THEME_CLASS_EDIT;
+ break;
+
+ case XP_THEME_ELEMENT_SPIN_BUTTON_UP:
+ case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:
+ klazz = XP_THEME_CLASS_SPIN;
+ break;
+
+ case XP_THEME_ELEMENT_PROGRESS_BAR_H:
+ case XP_THEME_ELEMENT_PROGRESS_BAR_V:
+ case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:
+ case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:
+ klazz = XP_THEME_CLASS_PROGRESS;
+ break;
+
+ case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:
+ case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:
+ klazz = XP_THEME_CLASS_TREEVIEW;
+ break;
+ }
+
+ if (klazz != XP_THEME_CLASS__SIZEOF)
+ {
+ ret = xp_theme_get_handle_by_class (klazz);
+ }
+ return ret;
+}
+
+
+static int
+xp_theme_map_gtk_state(XpThemeElement element, GtkStateType state)
+{
+ int ret;
+
+ switch(element)
+ {
+ case XP_THEME_ELEMENT_TAB_PANE:
+ ret = 0;
+ break;
+
+ case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:
+ case XP_THEME_ELEMENT_TAB_ITEM:
+ switch(state)
+ {
+ case GTK_STATE_PRELIGHT:
+ ret = TIS_HOT;
+ break;
+ case GTK_STATE_INSENSITIVE:
+ ret = TIS_DISABLED;
+ break;
+ case GTK_STATE_SELECTED:
+ case GTK_STATE_ACTIVE:
+ ret = TIS_NORMAL;
+ break;
+ default:
+ ret = TIS_SELECTED;
+ }
+ break;
+
+ case XP_THEME_ELEMENT_EDIT_TEXT:
+ switch(state)
+ {
+ case GTK_STATE_PRELIGHT:
+ ret = ETS_FOCUSED;
+ break;
+ case GTK_STATE_INSENSITIVE:
+ ret = ETS_READONLY;
+ break;
+ case GTK_STATE_SELECTED:
+ case GTK_STATE_ACTIVE:
+ default:
+ ret = ETS_NORMAL;
+ }
+ break;
+
+ case XP_THEME_ELEMENT_SCROLLBAR_H:
+ case XP_THEME_ELEMENT_SCROLLBAR_V:
+ case XP_THEME_ELEMENT_TROUGH_H:
+ case XP_THEME_ELEMENT_TROUGH_V:
+ switch(state)
+ {
+ case GTK_STATE_SELECTED:
+ case GTK_STATE_ACTIVE:
+ ret = SCRBS_PRESSED;
+ break;
+ case GTK_STATE_PRELIGHT:
+ ret = SCRBS_HOT;
+ break;
+ case GTK_STATE_INSENSITIVE:
+ ret = SCRBS_DISABLED;
+ break;
+ default:
+ ret = SCRBS_NORMAL;
+ }
+ break;
+
+ case XP_THEME_ELEMENT_ARROW_DOWN:
+ switch(state)
+ {
+ case GTK_STATE_ACTIVE:
+ ret = ABS_DOWNPRESSED;
+ break;
+ case GTK_STATE_PRELIGHT:
+ ret = ABS_DOWNHOT;
+ break;
+ case GTK_STATE_INSENSITIVE:
+ ret = ABS_DOWNDISABLED;
+ break;
+ default:
+ ret = ABS_DOWNNORMAL;
+ }
+ break;
+
+ case XP_THEME_ELEMENT_ARROW_UP:
+ switch(state)
+ {
+ case GTK_STATE_ACTIVE:
+ ret = ABS_UPPRESSED;
+ break;
+ case GTK_STATE_PRELIGHT:
+ ret = ABS_UPHOT;
+ break;
+ case GTK_STATE_INSENSITIVE:
+ ret = ABS_UPDISABLED;
+ break;
+ default:
+ ret = ABS_UPNORMAL;
+ }
+ break;
+
+ case XP_THEME_ELEMENT_ARROW_LEFT:
+ switch(state)
+ {
+ case GTK_STATE_ACTIVE:
+ ret = ABS_LEFTPRESSED;
+ break;
+ case GTK_STATE_PRELIGHT:
+ ret = ABS_LEFTHOT;
+ break;
+ case GTK_STATE_INSENSITIVE:
+ ret = ABS_LEFTDISABLED;
+ break;
+ default:
+ ret = ABS_LEFTNORMAL;
+ }
+ break;
+
+ case XP_THEME_ELEMENT_ARROW_RIGHT:
+ switch(state)
+ {
+ case GTK_STATE_ACTIVE:
+ ret = ABS_RIGHTPRESSED;
+ break;
+ case GTK_STATE_PRELIGHT:
+ ret = ABS_RIGHTHOT;
+ break;
+ case GTK_STATE_INSENSITIVE:
+ ret = ABS_RIGHTDISABLED;
+ break;
+ default:
+ ret = ABS_RIGHTNORMAL;
+ }
+ break;
+
+ case XP_THEME_ELEMENT_CHECKBOX:
+ case XP_THEME_ELEMENT_RADIO_BUTTON:
+ switch(state)
+ {
+ case GTK_STATE_SELECTED:
+ ret = CBS_CHECKEDPRESSED;
+ break;
+ case GTK_STATE_PRELIGHT:
+ ret = CBS_UNCHECKEDHOT;
+ break;
+ case GTK_STATE_INSENSITIVE:
+ ret = CBS_UNCHECKEDDISABLED;
+ break;
+ default:
+ ret = CBS_UNCHECKEDNORMAL;
+ }
+ break;
+
+ case XP_THEME_ELEMENT_PRESSED_CHECKBOX:
+ switch(state)
+ {
+ case GTK_STATE_SELECTED:
+ ret = CBS_CHECKEDPRESSED;
+ break;
+ case GTK_STATE_PRELIGHT:
+ ret = CBS_CHECKEDHOT;
+ break;
+ case GTK_STATE_INSENSITIVE:
+ ret = CBS_CHECKEDDISABLED;
+ break;
+ default:
+ ret = CBS_CHECKEDNORMAL;
+ }
+ break;
+
+ XP_THEME_ELEMENT_DEFAULT_BUTTON:
+ switch(state)
+ {
+ case GTK_STATE_ACTIVE:
+ ret = PBS_PRESSED;
+ break;
+ case GTK_STATE_PRELIGHT:
+ ret = PBS_HOT;
+ break;
+ case GTK_STATE_INSENSITIVE:
+ ret = PBS_DISABLED;
+ break;
+ default:
+ ret = PBS_DEFAULTED;
+ }
+ break;
+
+ case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:
+ switch(state)
+ {
+ case GTK_STATE_ACTIVE:
+ ret = DNS_PRESSED;
+ break;
+ case GTK_STATE_PRELIGHT:
+ ret = DNS_HOT;
+ break;
+ case GTK_STATE_INSENSITIVE:
+ ret = DNS_DISABLED;
+ break;
+ default:
+ ret = DNS_NORMAL;
+ }
+ break;
+
+ case XP_THEME_ELEMENT_SPIN_BUTTON_UP:
+ switch(state)
+ {
+ case GTK_STATE_ACTIVE:
+ ret = UPS_PRESSED;
+ break;
+ case GTK_STATE_PRELIGHT:
+ ret = UPS_HOT;
+ break;
+ case GTK_STATE_INSENSITIVE:
+ ret = UPS_DISABLED;
+ break;
+ default:
+ ret = UPS_NORMAL;
+ }
+ break;
+
+ case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:
+ ret = GLPS_OPENED;
+ break;
+
+ case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:
+ ret = GLPS_CLOSED;
+ break;
+
+ case XP_THEME_ELEMENT_PROGRESS_BAR_H:
+ case XP_THEME_ELEMENT_PROGRESS_BAR_V:
+ case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:
+ case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:
+ ret = 1;
+ break;
+
+ default:
+ switch(state)
+ {
+ case GTK_STATE_ACTIVE:
+ ret = PBS_PRESSED;
+ break;
+ case GTK_STATE_PRELIGHT:
+ ret = PBS_HOT;
+ break;
+ case GTK_STATE_INSENSITIVE:
+ ret = PBS_DISABLED;
+ break;
+ default:
+ ret = PBS_NORMAL;
+ }
+ }
+ return ret;
+}
+
+gboolean
+xp_theme_draw(GdkWindow *win, XpThemeElement element, GtkStyle *style,
+ int x, int y, int width, int height, GtkStateType state_type)
+{
+ HTHEME theme;
+ RECT rect;
+ int xoff, yoff, state;
+ HDC dc;
+ GdkDrawable *drawable;
+ int part_state;
+
+ if (!uxtheme_dll)
+ return FALSE;
+
+ theme = xp_theme_get_handle_by_element(element);
+ if (!theme)
+ return FALSE;
+
+ /* FIXME: Recheck its function */
+ enable_theme_dialog_texture_func(GDK_WINDOW_HWND(win), ETDT_ENABLETAB);
+
+ if (!GDK_IS_WINDOW(win))
+ {
+ xoff = 0;
+ yoff = 0;
+ drawable = win;
+ }
+ else
+ {
+ gdk_window_get_internal_paint_info(win, &drawable, &xoff, &yoff);
+ }
+ rect.left = x - xoff;
+ rect.top = y - yoff;
+ rect.right = rect.left + width;
+ rect.bottom = rect.top + height;
+
+ gdk_gc_set_clip_rectangle (style->dark_gc[state_type], NULL);
+ dc = gdk_win32_hdc_get(drawable, style->dark_gc[state_type], 0);
+ if (!dc)
+ return FALSE;
+
+ part_state = xp_theme_map_gtk_state(element, state_type);
+ draw_theme_background_func(theme, dc, element_part_map[element], part_state, &rect, 0);
+ gdk_win32_hdc_release(drawable, style->dark_gc[state_type], 0);
+
+ return TRUE;
+}
+
+gboolean
+xp_theme_is_drawable(XpThemeElement element)
+{
+ gboolean ret = FALSE;
+
+ if (uxtheme_dll)
+ {
+ ret = xp_theme_get_handle_by_element(element) != NULL;
+ }
+ return ret;
+}
+
+gboolean
+xp_theme_get_system_font(LOGFONTW *lf)
+{
+ gboolean ret = FALSE;
+ if (get_theme_sys_font_func != NULL)
+ {
+ HRESULT hr = (*get_theme_sys_font_func)(NULL, TMT_MSGBOXFONT, lf);
+ ret = (hr == S_OK);
+ }
+ return ret;
+}